/**
 * 版权所有 2009-2015 中国中医科学院中医药信息研究所 何前锋 frontpeak@yahoo.com.cn
 **/
package cn.ac.cintcm.sh.service;

import java.util.List;

import cn.ac.cintcm.sh.dao.HerbDao;
import cn.ac.cintcm.sh.dao.PrescriptionDao;
import cn.ac.cintcm.sh.domain.AvgDosage;
import cn.ac.cintcm.sh.domain.HerbEntry;
import cn.ac.cintcm.sh.domain.Prescription;
import cn.ac.cintcm.sh.domain.Qi9;

/**
 * 中药的服务
 * @author 何前锋 Franklin He(franklinheqf@gmail.com)
 *
 */
public class HerbService {

    private HerbDao herbDao = new HerbDao();

    /**
     * 取得中药的索引
     * @return 中药名称索引
     */
    public List<HerbEntry> getHerbIndex() {
        List<HerbEntry> herbs = herbDao.getHerbs();
        return herbs;
    }
    
    /**
     * 按照名称检索中药
     * @param name 给定的名称字符串
     * @param isPrecise 是否精确搜索, 值为字符串的"true"或者"false"
     * @param extendAlias 是否使用同异名扩展, 值为字符串的"true"或者"false"
     * @return 符合名称的中药
     */
    public List<HerbEntry> getHerbs(String name, String isPrecise, String extendAlias) {
        boolean precise = Boolean.parseBoolean(isPrecise);
        boolean extended = Boolean.parseBoolean(extendAlias);
        List<HerbEntry> herbs = herbDao.getHerbs(name, precise, extended);
        return herbs;
    }
    
    /**
     * 取得在一定寒热值范围内的中药
     * @param min 最小寒热值，取值为整数
     * @param max 最大寒热值，取值为整数
     * @return
     */
    public List<HerbEntry> getHCPrescriptions(String min, String max) {
        List<HerbEntry> herbs = null;
        float minv = Qi9.MinValue;
        float maxv = Qi9.MaxValue;
        if (min != null) {
            try {
                float smin = Float.parseFloat(min);
                if (smin > minv  && smin < maxv) {
                    minv = smin;
                }
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
        }
        if (max != null) {
            try {
                float smax = Float.parseFloat(max);
                if (smax > minv && smax < maxv) {
                    maxv = smax; 
                }
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
        }

        herbs = herbDao.getHerbs(minv, maxv);
        return herbs;
    }
    
    /**
     * 获取中药所在的所有方剂
     * @param id 中药的id
     * @return
     */
    public List<Prescription> getPrescriptions(String id) {
        List<Prescription> pres = null;
        if (id != null) {
            PrescriptionDao pd = new PrescriptionDao();
            String[] herbList = new String[1];
            herbList[0] = id;
            pres = pd.getPrescriptions(herbList);
        }
        return pres; 
    }
    
    /**
     * 获取中药基本信息
     * @param id 中药id
     * @return 中药的基本信息
     */
    public HerbEntry getHerb(String id) {
        HerbEntry he = null;
        if (id != null) {
            he = herbDao.getHerb(id);
        }
        return he;
    }
    
    /**
     * 获取中药所在的方剂的所有剂量
     * @param id 中药id
     * @return 方剂名称与包含该中药的剂量
     */
    public AvgDosage getAvgDosage(String id) {
        AvgDosage dosage = null;
        if (id != null) {
            dosage = herbDao.getPrescriptionsAvgDosage(id);
            dosage.calculate();
        }
        return dosage;
    }
    
}